package 代码随想录.数组.螺旋矩阵;

import com.sun.java.swing.plaf.windows.WindowsTableHeaderUI;

import java.util.LinkedList;
import java.util.List;

/**lc54. 螺旋矩阵
 * link:https://leetcode-cn.com/problems/spiral-matrix/
 * @author ChenweiLin
 * @create 2021-12-01 20:30
 */
public class spiralMatrix {
    public static void main(String[] args) {
        List<Integer> integers = spiralOrder(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}});
        System.out.println(integers.toString());
    }

    public static List<Integer> spiralOrder(int[][] matrix) {
        //模拟过程
        int size = matrix.length * matrix[0].length;//一共有多少个数
        int rowSize = matrix.length;//最大行数
        int columnSize = matrix[0].length;//最大列数
        List<Integer> resultList = new LinkedList<>();
        int startRow = 0;//
        int startColumn = 0;
        int loopCount = 0;
        //读取数字
        while (size > 0 && startRow != rowSize/2){
            loopCount++;//圈数+1
            //上边
            //要记住每一次的内循环都要校验size是否读完，以及每次填充数都要减去size
            for (; startColumn < columnSize-loopCount && size>0 ; size--,startColumn++) {//读取第0行除最后一列的所有列，注意圈的层数
                int num = matrix[startRow][startColumn];
                System.out.println(num);
                resultList.add(num);
            }

            //右边
            for (; startRow < rowSize-loopCount && size>0; size--,startRow++) {//末列除末行外所有行
                int num = matrix[startRow][startColumn];
                System.out.println(num);
                resultList.add(num);
            }

            //下边
            for (;  startColumn> loopCount -1 && size>0; size--,startColumn--) {//从末列末行那个数开始沿着x轴向前读取
                int num = matrix[startRow][startColumn];
                System.out.println(num);
                resultList.add(num);
            }
            
            //左边
            for (; startRow > loopCount-1 && size>0 ; size--,startRow--) {//从0列末行那个数开始沿着y轴向上读取
                int num = matrix[startRow][startColumn];
                System.out.println(num);
                resultList.add(num);
            }

            //一圈结束 两个start指针复原，下一圈的初始位置是上一圈的行+1且列+1
            startRow++;//
            startColumn++;

        }
        //如果行是奇数 读取内部的最后一行
        if (rowSize % 2== 1){
            while (size > 0){
                resultList.add(matrix[startRow][startColumn++]);
                size--;
            }
        }
        return resultList;
    }
}
